struct FlightData { int rpm; int airspeed; float verticalSpeed; float altitude; int pitch; float heading; int bank; } gFlightData;
const int gRpmIncrement = 100; const int gPitchIncrement = 1; const int gAirspeedIncrement = 2; const int gVsiIncrement = 100;
struct PowerData { int rpm; int bhp; } ; PowerData gPowerData[ 18 ] = { 700, 40, 800, 42, 900, 45, 1000, 50, 1100, 55, 1200, 65, 1300, 80, 1400, 90, 1500, 95, 1600, 100, 1700, 104, 1800, 110, 1900, 115, 2000, 120, 2200, 130, 2400, 140, 2600, 150, 2700, 160 };
// Function is CalcPowerCurve(). for ( j = 0; j < 18; j++ ) { if ( gFlightData.rpm <= gPowerData[ j ].rpm ) break; }
if ( i < 17 && j < 18 ) retval = gPowerData[ j ].bhp - ( gPowerCurveData[ i ].bhpReqd + ( bank / 2 ) );
gFlightData.verticalSpeed = ( CalcPowerCurve() * 33000 ) / 2300; gFlightData.altitude += ( gFlightData.verticalSpeed / 60 ); // Argh: tied to 1-second update.
gFlightData.heading += gHeadingIncrement * CalcTurnRate(); float CalcTurnRate( void ) { float retval = 0; // Are we banked? if ( gFlightData.bank != 0 ) { int i = 0; int bankAngle = gFlightData.bank; // Absolute value for array lookup. if ( bankAngle < 0 ) bankAngle = -bankAngle; // Find array index closest to our current bank angle. for ( i = 0; i < 4; i++ ) { if ( bankAngle >= gBankData[ i ].angle ) { break; } } if ( i == 4 ) // No index found, so assume very small bank value. retval = 1091 * 0.12 / gFlightData.airspeed; else retval = 1091 * gBankData[ i ].multiplier / gFlightData.airspeed; if ( gFlightData.bank < 0 ) retval = -retval; } return retval; }